{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# LeNet on Cifar\n",
    "\n",
    "This is LeNet (6c-16c-120-84) on Cifar10. Adam algorithm (lr=0.001) with 100 epoches.\n",
    "\n",
    "\n",
    "#### LeNet\n",
    "\n",
    "    Total params: 44,426\n",
    "    Trainable params: 44,426\n",
    "    Non-trainable params: 0\n",
    "\n",
    "\n",
    "####  LeNet with 10 intrinsic dim\n",
    "\n",
    "    Total params: 682,076\n",
    "    Trainable params: 10\n",
    "    Non-trainable params: 682,066\n",
    "    \n",
    "#### LeNet with 15000 intrinsic dim    \n",
    "    Total params: 930,167,006\n",
    "    Trainable params: 15,000\n",
    "    Non-trainable params: 930,152,006"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "import os, sys\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "from matplotlib.pyplot import *\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def extract_num(lines0):\n",
    "\n",
    "    valid_loss_str     = lines0[-5]\n",
    "    valid_accuracy_str = lines0[-6]\n",
    "    train_loss_str     = lines0[-8]\n",
    "    train_accuracy_str = lines0[-9]\n",
    "#     run_time_str       = lines0[-10]\n",
    "\n",
    "    valid_loss     = float(valid_loss_str.split( )[-1])\n",
    "    valid_accuracy = float(valid_accuracy_str.split( )[-1])\n",
    "    train_loss     = float(train_loss_str.split( )[-1])\n",
    "    train_accuracy = float(train_accuracy_str.split( )[-1])\n",
    "#     run_time       = float(run_time_str.split( )[-1])\n",
    "    \n",
    "    return valid_loss, valid_accuracy, train_loss, train_accuracy #, run_time"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0 dim:\n",
      "(1.01539, 0.6469, 1.17757, 0.59576)\n",
      "\n",
      "10 dim:\n",
      "(3.54838, 0.1176, 8.04742, 0.09838)\n",
      "\n",
      "50 dim:\n",
      "(2.89372, 0.1026, 5.80965, 0.09782)\n",
      "\n",
      "100 dim:\n",
      "(2.45154, 0.1049, 3.77091, 0.09966)\n",
      "\n",
      "250 dim:\n",
      "(2.34088, 0.1126, 3.15073, 0.10368)\n",
      "\n",
      "500 dim:\n",
      "(2.26612, 0.1674, 2.43965, 0.11376)\n",
      "\n",
      "750 dim:\n",
      "(2.06156, 0.2198, 2.23409, 0.1632)\n",
      "\n",
      "1000 dim:\n",
      "(1.98951, 0.2655, 2.16624, 0.18432)\n",
      "\n",
      "1250 dim:\n",
      "(1.89666, 0.2956, 2.07213, 0.20546)\n",
      "\n",
      "1500 dim:\n",
      "(1.85398, 0.3113, 2.02529, 0.21956)\n",
      "\n",
      "1750 dim:\n",
      "(1.8027, 0.3207, 1.97152, 0.23738)\n",
      "\n",
      "2000 dim:\n",
      "(1.78534, 0.3613, 1.96328, 0.24452)\n",
      "\n",
      "2500 dim:\n",
      "(1.77404, 0.333, 1.9165, 0.256)\n",
      "\n",
      "3000 dim:\n",
      "(1.72618, 0.3506, 1.88359, 0.27404)\n",
      "\n",
      "4000 dim:\n",
      "(1.63897, 0.3959, 1.80887, 0.31916)\n",
      "\n",
      "5000 dim:\n",
      "(1.59235, 0.4146, 1.74418, 0.3389)\n",
      "\n",
      "10000 dim:\n",
      "(1.39927, 0.5138, 1.58611, 0.42422)\n",
      "\n",
      "15000 dim:\n",
      "(1.31614, 0.5377, 1.50521, 0.45814)\n",
      "\n",
      "16000 dim:\n",
      "(1.30302, 0.5384, 1.50335, 0.4611)\n",
      "\n",
      "17000 dim:\n",
      "(1.31779, 0.5239, 1.48574, 0.46818)\n",
      "\n",
      "18000 dim:\n",
      "(1.29441, 0.5364, 1.48503, 0.46712)\n",
      "\n",
      "19000 dim:\n",
      "(1.28327, 0.5355, 1.46402, 0.47336)\n",
      "\n",
      "20000 dim:\n",
      "(1.26157, 0.5514, 1.46839, 0.47328)\n",
      "\n",
      "21000 dim:\n",
      "(1.28015, 0.5423, 1.47583, 0.47592)\n",
      "\n",
      "25000 dim:\n",
      "(1.27441, 0.5521, 1.44283, 0.48648)\n",
      "\n",
      "30000 dim:\n",
      "(1.22823, 0.5752, 1.42175, 0.4977)\n",
      "\n",
      "35000 dim:\n",
      "(1.2065, 0.5747, 1.41296, 0.50398)\n",
      "\n",
      "40000 dim:\n",
      "(1.17702, 0.5881, 1.39292, 0.51096)\n",
      "\n",
      "45000 dim:\n",
      "(1.1559, 0.6003, 1.38522, 0.51882)\n",
      "\n",
      "50000 dim:\n",
      "(1.14271, 0.6058, 1.37156, 0.52032)\n",
      "\n"
     ]
    }
   ],
   "source": [
    "results_dir = '../results/lrb_lenet_cifar/'\n",
    "\n",
    "dim = [0,10,50,100,250,500,750,1000,1250,1500,1750,2000,2500,3000,4000,5000,10000,15000,16000,17000,18000,19000,20000,21000,25000,30000,35000,40000,45000,50000]\n",
    "\n",
    "# filename list of diary\n",
    "diary_names = []\n",
    "for subdir, dirs, files in os.walk(results_dir):\n",
    "    for file in files:\n",
    "        if file == 'diary':\n",
    "            fname = os.path.join(subdir, file)\n",
    "            diary_names.append(fname)\n",
    "  \n",
    "diary_names_ordered = []\n",
    "for d in dim:\n",
    "    for f in diary_names:\n",
    "        if '_'+str(d)+'/' in f:\n",
    "            # print \"%d is in\" % d + f\n",
    "            diary_names_ordered.append(f)        \n",
    " \n",
    "# intrinsic update method\n",
    "Rs = []\n",
    "i = 0\n",
    "for fname in diary_names_ordered:\n",
    "    with open(fname,'r') as ff:\n",
    "        lines0 = ff.readlines()\n",
    "        R = extract_num(lines0)\n",
    "        print \"%d dim:\\n\"%dim[i] + str(R) + \"\\n\"\n",
    "        i += 1\n",
    "\n",
    "        Rs.append(R)\n",
    "                            \n",
    "Rs = np.array(Rs)\n",
    "\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Performance comparison with Baseline\n",
    "\n",
    "\"Baseline method\" indicates optimization in the parameter space.\n",
    "\n",
    "The proposed method first embeds parameters into the intrinisic space (via orthogonal matrix), and optimization is the new space.\n",
    "\n",
    "The dimension of intrinsic space indicates the degree of freedom in the weights of neural nets."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAABCMAAAJQCAYAAAC0Ka6dAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3X+YnXV9J/z31yEIGAoCAi7xB1Vojx0ghpiAnF0zSvkl\n1W2V0sFCsUdpH3UUlfZBD48/8DlWV/tcKuK6qQOydZnolqKuC62rnazOsmKIgkRPEaQrxpYKWCxB\n0STczx/54QRIMoE595mcvF7XNRdz3/M99/nk5nsFznu+389dqqoKAAAAQF2e1O8CAAAAgD2LMAIA\nAAColTACAAAAqJUwAgAAAKiVMAIAAAColTACAAAAqJUwAgAAAKiVMAIAAAColTACAAAAqNVe/S5g\nVx1yyCHVs5/97H6XscsefPDBPOUpT+l3GTCrzGsGlbnNoDK3GUTmNYNqd5zbq1evvreqqqfNZOxu\nF0Y8+9nPzk033dTvMnbZypUrs2zZsn6XAbPKvGZQmdsMKnObQWReM6h2x7ldSvn+TMfapgEAAADU\nShgBAAAA1EoYAQAAANRqt+sZAQAAwOxZv3591q5dm4ceeqjfpTDNAQcckG632+8yHtM+++yTBQsW\nZN68eY/7GsIIAACAPdjatWuz//7759nPfnZKKf0uh80eeOCB7L///v0u41Gqqsp9992XtWvX5sgj\nj3zc17FNAwAAYA/20EMP5eCDDxZEMCOllBx88MFPeCWNMAIAAGAPJ4hgV8zGfBFGAAAAALUSRgAA\nANA39913XxYuXJiFCxfm8MMPzxFHHLH1+Be/+MWMr3PFFVfk7rvv3nr86le/Orfddtus1/u9730v\nS5YsyXOf+9ycc845Wb9+/aPG/PznP88f/MEf5JhjjsnChQvzla98JcmmfgtJ8q53vWvr8YYNG3Lg\ngQfOep1b3HHHHVm4cGGS5MYbb8yb3/zmnr3XrtDAEgAAgL45+OCDc/PNNyfZ9CF9/vz5ueiii3b5\nOldccUUWLVqUww8/PEly5ZVXzmqdW/zJn/xJ/vRP/zSvfOUr85rXvCaf/OQn89rXvnabMR//+Mez\n995759Zbb83dd9+dM888M6tWrcrf/M3f5IYbbsjPf/7zLF++PD/72c/y+te/vid1PpalS5dm6dKl\ntb3fjlgZAQAAwJx01VVXZcmSJVm4cGFe97rX5eGHH86GDRty7rnn5phjjsnw8HA+8pGP5NOf/nRu\nvvnmnH322VtXVDSbzdx8881bVx5cfPHFOe6443LiiSfmRz/6UZLk9ttvz9KlS3PMMcek3W7vdIXC\nxo0b85WvfCW//du/nST5gz/4g3z2s5991LjvfOc7efGLX5wkOfzww/OUpzwl3/zmN3P66afnxS9+\ncT70oQ/lgQceyJve9Katr3njG9+Y3/iN38hv/uZv5r777kuyKdR4wQtekOOOOy5nnXVWfvaznyVJ\nVqxYkeHh4Rx33HEZGRlJkmzYsCFvectbsmTJkhx77LH5xCc+8ai6vvSlL+Xf//t/nyS55JJL0mq1\n8qIXvSi/+qu/mssvv3yH9322CSMAAAD4pWXLdv71wQ9uO/6Tn9z0/b33Pnrs47RmzZpce+21ueGG\nG7aGCitWrMjq1atz77335tZbb82aNWty3nnnbQ0htoQSe++99zbX+slPfpIXvehFueWWW3LiiSfm\niiuuSJKMjY3loosuyq233pqnP/3pW8dv3LgxixcvflRN99xzTw455JAMDQ0lSRYsWJAf/vCHjxp3\n3HHH5XOf+1w2btyY733ve/nmN7+ZH/zgB/mbv/mb/N3f/V0uvPDCzJ8/P5dddtnW+k466aR8+9vf\nzoknnpj3vOc9SZKzzjorq1atyi233JLnPOc5+eTm+/zud787X/7yl3PLLbfk2muvTZIsX748hx56\naL7+9a9n1apVufzyy3PXXXft8B5/97vfzf/4H/8jX/va1/KOd7wjGzdu3O59n222aQAAADDnfOlL\nX8qqVau2hgI/+9nP8oxnPCOnnnpqbrvttrzxjW/MS1/60pxyyik7vda+++6b008/PUly/PHH56tf\n/WqSTT0UrrvuuiTJOeeck0suuSRJMjQ0lJtuuulx1/7a1742t912W44//vgceeSReeELX5ihoaGc\neuqpOe200/Kud70rf/RHf5SqqrJx48bstddeOeuss5Ikv//7v59zzjknSfKtb30r73jHO3L//ffn\ngQceyJlnnpkkOemkk3LeeeflrLPOyu/8zu8kSb74xS+m2+1uDQ5+8pOf5Pbbb8+znvWs7dZ55pln\nZu+9986hhx6agw46KPfcc8927/tsE0YAAADwSytXPv7xhxyy66/fjqqq8od/+IdbVwlM961vfSvX\nX399Lr/88lxzzTVZvnz5Dq81faXE0NBQNmzY8LhqetrTnpZ77703GzduzNDQUNauXZsjjjjiUePm\nzZuXD3/4w1uPlyxZkqOPPnrrIzG3NLDc3iMyt5w/77zzcv3112d4eDif+MQn8rWvfS1J8hd/8Re5\n8cYb84UvfCGLFi3KN7/5zVRVlY997GN5yUtess217rjjju3+eZ785Cdv/X7LfdnRfZ9NtmkAAAAw\n55x88sn5zGc+k3vvvTfJpqdu3HXXXbnnnntSVVXOOuusXHrppfnGN76RJNl///3zwAMP7NJ7LFmy\nZOs2h5lsRRgaGsq//bf/dutrrrrqqrz85S9/1LgHH3wwP/3pT5Mk119/febPn5+jjz56u9fdsGFD\n/vqv/zpJcvXVV6fZbG69zuGHH57169fn6quv3jr+zjvvzAknnJD3vOc9eepTn5of/vCHOfXUU/Ox\nj31sa9By2223be0xsSu2d99nm5URAAAAzDnHHHNM3vnOd+bkk0/Oww8/nHnz5uXjH/94hoaG0mq1\nUlVVSil5//vfn2TTozxf85rXZN99983Xv/71Gb3HRz7ykZx77rl597vfnVNPPTUHHHBAkk09I5Yu\nXfqYWzU+8IEPZHR0NBdffHEWL16c888/P0ly7bXX5tZbb8073vGO3H333TnjjDPypCc9KQsWLMhV\nV121wzoOOOCAfPWrX8073/nOPP3pT8+nP/3pJMmll16aF7zgBXna056WJUuW5KGHHkqSvPnNb84/\n/MM/pKqqnHLKKRkeHk6j0chdd9219TGehx56aD73uc/N6D5Mt737/sxnPnOXr7UjZctzTncXixcv\nrp7I3p1+WblyZZY9geYtMBeZ1wwqc5tBZW4ziMzrJ67b7abRaPS7jL548MEHs99++6WUkk996lO5\n9tprc8011/S7rCTJAw88kP3337/fZWzXY82bUsrqqqoe3fnzMVgZAQAAwB5p1apVufDCC/Pwww/n\nqU99aq688sp+l7THEEYAAACwR1q2bFluvvnmfpexR9LAEgAAAKiVMAIAAAColTACAAAAqJUwAgAA\nAKiVMAIAAIC+ue+++7Jw4cIsXLgwhx9+eI444oitx7/4xS9mfJ0rrrgid99999bjV7/61bnttttm\nvd4FCxbk/vvvn/XrJsmGDRty4IEHJknWrl2bs88+uyfvMxd4mgYAAAB9c/DBB299osW73vWuzJ8/\nPxdddNEuX+eKK67IokWLcvjhhyfJbv+YzgULFuTTn/50v8voGSsjAAAAmJOuuuqqLFmyJAsXLszr\nXve6PPzww9mwYUPOPffcHHPMMRkeHs5HPvKRfPrTn87NN9+cs88+e+uKimazmZtvvnnraoOLL744\nxx13XE488cT86Ec/SpLcfvvtWbp0aY455pi02+2tqxJ25s/+7M9yzDHHZOnSpbnzzjuTJJ/73Oey\ndOnSPP/5z88pp5yy9T3+7u/+Lscdd1wWLlyYRYsW5cEHH0ySvO9978uSJUty7LHH5tJLL33Ue3zv\ne9/LwoULkySf+MQn8spXvjKnnnpqjjrqqLztbW/bOu7666/PiSeemEWLFuXss8/eev25zsoIAAAA\nkiQXXphsXqQwaxYuTD70oV1/3Zo1a3LttdfmhhtuyF577ZULLrggK1asyHOe85zce++9ufXWW5Mk\n999/fw488MBcdtll+ehHP7r1A/x0P/nJT/KiF70o73vf+/KWt7wlV1xxRS6++OKMjY3loosuylln\nnZWPfvSjW8dv3LgxS5cuzU033fSYtR100EG59dZbc8UVV+Qtb3lLPvvZz+bf/bt/l5e97GUppeTj\nH/94/vzP/zzvf//784EPfCDLly/P0qVLs27duuyzzz657rrrctddd+XGG29MVVU544wzcsMNN2TJ\nkiXbvR+33HJLVq9enXnz5uXoo4/O2NhY9tprr7zvfe/Ll7/85ey3337pdDr58Ic/nLe//e27fsNr\nJowAAABgzvnSl76UVatWZfHixUmSn/3sZ3nGM56RU089Nbfddlve+MY35qUvfWlOOeWUnV5r3333\nzemnn54kOf744/PVr341SXLjjTfmuuuuS5Kcc845ueSSS5IkQ0ND2w0ikmR0dDRJ8qpXvSoXX3xx\nkuSuu+7K7/7u7+buu+/Oz3/+8xx99NFJkpNOOilvetOb8qpXvSqveMUrMn/+/Hzxi1/M9ddfn+c/\n//lJknXr1uW73/3uDsOIk08+Ob/yK7+SJPn1X//13HXXXbn77rvzne98Jy984QuTZOuKkN2BMAIA\nAIAkj28FQ69UVZU//MM/zHve855H/exb3/pWrr/++lx++eW55pprsnz58h1ea++99976/dDQUDZs\n2PCEaiulPOrc61//+rz97W/PGWeckS996Ut53/velyS55JJL8rKXvSz//b//95xwwgn58pe/nKqq\ncskll6TVam1zjR3V9eQnP/lRf4aqqnLaaaflL//yL5/Qn6cf9IwAAABgzjn55JPzmc98Jvfee2+S\nTU/duOuuu3LPPfekqqqcddZZufTSS/ONb3wjSbL//vvngQce2KX3WLJkSa699tokyYoVK2b8ui2N\nJScmJnLSSScl2bQV5IgjjkhVVbnqqqu2jv3e976XY489Nm9729uyaNGi3HbbbTn11FMzPj6+tb/D\n2rVrt/45d8ULX/jC/M//+T+39q148MEHc/vtt+/ydfrByggAAADmnGOOOSbvfOc7c/LJJ+fhhx/O\nvHnz8vGPfzxDQ0NptVqpqiqllLz//e9PsulRnq95zWuy77775utf//qM3uMjH/lIzj333Lz73e/O\nqaeemgMOOCDJzntG3HvvvTn22GOz7777ZmJiIsmmJ4H89m//dg466KAsW7Ys//RP/5Qk+eAHP5iv\nfvWredKTnpRjjz02p5xySvbee+/8/d//fU444YQkm4KUq6++esYNNLc47LDDMj4+nrPPPnvrY1Df\n+9735qijjtql6/RDqaqq3zXsksWLF1c72rszV61cuTLLli3rdxkwq8xrBpW5zaAytxlE5vUT1+12\n02g0+l1GXzz44IPZb7/9UkrJpz71qVx77bW55ppr+l1WkuSBBx7I/vvv3+8ytuux5k0pZXVVVYtn\n8norIwAAANgjrVq1KhdeeGEefvjhPPWpT82VV17Z75L2GMIIAAAA9kjLli3LzbP9LFNmRANLAACA\nPdzutn2f/pqN+SKMAAAA2IPts88+ue+++wQSzEhVVbnvvvuyzz77PKHr2KYBAACwB1uwYEHWrl2b\ne+65p9+lMM1DDz30hD/w98o+++yTBQsWPKFrCCMAAAD2YPPmzcuRRx7Z7zJ4hJUrV+b5z39+v8vo\nGds0AAAAgFoJIwAAAIBa9SyMKKVcUUr5USllzXZ+XkopHyml3FFK+VYpZVGvagEAAADmjl6ujPhk\nktN28PPTkxy1+euCJP+xh7UAAAAAc0TPwoiqqr6S5Mc7GPLyJP+52uRrSQ4spTy9V/UAAAAAc0M/\nn6ZxRJIfTDteu/ncPz1yYCnlgmxaPZHDDjssK1eurKO+WbVu3brdsm7YEfOaQWVuM6jMbQaRec2g\nGvS5vVs82rOqquVJlifJ4sWLq2XLlvW3oMdh5cqV2R3rhh0xrxlU5jaDytxmEJnXDKpBn9v9fJrG\nD5M8Y9rxgs3nAAAAgAHWzzDi80nO2/xUjROS/KSqqkdt0QAAAAAGS8+2aZRSJpIsS3JIKWVtkncm\nmZckVVV9PMl1Sc5IckeSnyZ5da9qAQAAAOaOnoURVVWN7uTnVZLX9+r9AQAAgLmpn9s0AAAAgD2Q\nMAIAAAColTACAAAAqJUwAgAAAKiVMAIAAAColTACAAAAqJUwAgAAAKiVMAIAAAColTACAAAAqJUw\nAgAAAKiVMAIAAAColTACAAAAqJUwAgAAAKiVMAIAAAColTACAAAAqJUwAgAAAKiVMAIAAAColTAC\nAAAAqJUwAgAAAKiVMAIAAAColTACAAAAqJUwAgAAAKiVMAIAAAColTACAAAAqJUwAgAAAKiVMAIA\nAAColTACAAAAqJUwAgAAAKiVMAIAAAColTACAAAAqJUwAgAAAKiVMAIAAAColTACAAAAqJUwAgAA\nAKiVMAIAAAColTACAAAAqJUwAgAAAKiVMAIAAAColTACAAAAqJUwAgAAAKiVMAIAAAColTACAAAA\nqJUwAgAAAKiVMAIAAAColTACAAAAqJUwAgAAAKiVMAIAAAColTACAAAAqJUwAgAAAKiVMAIAAACo\nlTACAAAAqJUwAgAAAKiVMAIAAAColTACAAAAqJUwAgAAAKiVMAIAAAColTACAAAAqJUwAgAAAKiV\nMAIAAAColTACAAAAqJUwAgAAAKiVMAIAAAColTACAAAAqJUwAgAAAKiVMAIAAAColTACAAAAqJUw\nAgAAAKiVMAIAAAColTACAAAAqJUwAgAAAKiVMAIAAAColTACAAAAqJUwAgAAAKiVMAIAAAColTAC\nAAAAqJUwAgAAAKiVMAIAAAColTACAAAAqJUwAgAAAKiVMAIAAAColTACAAAAqJUwAgAAAKhVT8OI\nUspppZTbSil3lFIufoyfP7OUMllK+WYp5VullDN6WQ8AAADQfz0LI0opQ0kuT3J6kuclGS2lPO8R\nwy5J8pmqqp6f5PeSfKxX9QAAAABzQy9XRixJckdVVXdWVfWLJCuSvPwRY6okv7L5+wOS/GMP6wEA\nAADmgFJVVW8uXMork5xWVdVrNh+fm2RpVVVvmDbm6Um+mOSpSZ6S5OSqqlY/xrUuSHJBkhx22GHH\nr1ixoic199K6desyf/78fpcBs8q8ZlCZ2wwqc5tBZF4zqHbHuT0yMrK6qqrFMxm7V6+L2YnRJJ+s\nqurPSyknJvnLUspwVVUPTx9UVdXyJMuTZPHixdWyZcvqr/QJWrlyZXbHumFHzGsGlbnNoDK3GUTm\nNYNq0Od2L7dp/DDJM6YdL9h8brpWks8kSVVV/zvJPkkO6WFNAAAAQJ/1MoxYleSoUsqRpZS9s6lB\n5ecfMeauJC9JklJKI5vCiHt6WBMAAADQZz0LI6qq2pDkDUn+Nkk3m56a8e1SyqWllJdtHvbWJK8t\npdySZCLJ+VWvmlgAAAAAc0JPe0ZUVXVdkusece4d077/TpKTelkDAAAAMLf0cpsGAAAAwKMIIwAA\nAIBaCSMAAACAWgkjAAAAgFoJIwAAAIBaCSMAAACAWgkjAAAAgFoJIwAAAIBaCSMAAACAWgkjAAAA\ngFoJIwAAAIBaCSMAAACAWgkjAAAAgFoJIwAAAIBaCSMAAACAWgkjAAAAgFoJIwAAAIBaCSMAAACA\nWgkjAAAAgFoJIwAAAIBaCSMAAACAWgkjAAAAgFoJIwAAAIBaCSMAAACAWgkjAAAAgFoJIwAAAIBa\nCSMAAACAWgkjAAAAgFoJIwAAAIBaCSMAAACAWgkjAAAAgFoJIwAAAIBaCSMAAACAWgkjAAAAgFoJ\nIwAAAIBaCSMAAACAWgkjAAAAgFoJIwAAAIBaCSMAAACAWgkjAAAAgFoJIwAAAIBaCSMAAACAWgkj\nAAAAgFoJIwAAAIBaCSMAAACAWgkjAAAAgFoJIwAAAIBaCSMAAACAWgkjAAAAgFoJIwAAAIBaCSMA\nAACAWgkjAAAAgFoJIwAAAIBaCSMAAACAWgkjAAAAgFoJIwAAAIBaCSMAAACAWgkjAAAAgFoJIwAA\nAIBaCSMAAACAWgkjAAAAgFoJIwAAAIBa7dXvAvYEF16YrFy5MAce2O9KYHbdf795zWAytxlU5jaD\nyLxmUB1yyHOzbFm/q+gdKyMAAACAWlkZUYMPfShZufLmLBvkWIs9knnNoDK3GVTmNoPIvGZQrVx5\nR5IF/S6jZ6yMAAAAAGoljAAAAABqJYwAAAAAaiWMAAAAAGoljAAAAABqJYwAAAAAaiWMAAAAAGol\njAAAAABqJYwAAAAAaiWMAAAAAGoljAAAAABqJYwAAAAAaiWMAAAAAGoljAAAAABqJYwAAACAOWJi\nYiLDw8NZvXp1hoeHMzEx0e+SemKvfhcAAAAAbAoi2u12xsfHkySLFi1Kq9VKkoyOjvaztFnX05UR\npZTTSim3lVLuKKVcvJ0xv1tK+U4p5dullKt7WQ8AAADMVZ1OJ+Pj4xkZGUkpJSMjIxkfH0+n0+l3\n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\n65c8LLifqvrHJMcneWJV3ZTZSr1vT3J+VW1N8o0kvzl1/0SSX81sQaj/SfJbSdLdt1bVn2b2j32S\nvLW7dy2K+duZPbHjMUn+efqCRXtuklckuW66tz5J/jBqm/XvyUnOnZ4O8CNJzu/ui6rqi0nOq6q3\nJfl8ZmFcpu8frKodmS1WfEqSdPf1VXV+ki9m9vSZ10y3f8T8hUeQP4i6Zn3bmOSj022iByT5h+7+\nZFVdmf18PlKzABEAAABgDLdpAAAAAEMJIwAAAIChhBEAAADAUMIIAAAAYChhBAAAADCUMAIASFXt\n3Ic+r6+qH93L8fdU1eaH8N5bquqsB9F/W1XdUFXXVtWXq+pvq+qQueOfe7BjAADG8mhPACBVtbO7\nH/cAfb6eZEt3f3s3xzZ09z2LGt+a99qW5Pe7+6qqOjDJn0/j+qUR7w8APHyujAAA7lNVx09XHlww\nXXXwoZr53SQ/keTSqrp06ruzqv6yqq5J8pzpdVvmjv1ZVV1TVZdV1cap/aVVtX1q/+zce140bT+u\nqv6+qq6brnz4jb2Nt7vvSvKGJD9ZVUfveu+58/5LVX28qr5WVW+vqtOq6orp/E9byB8iAPCAhBEA\nwFrPTvL6JJuT/HSS53b3WUn+M8kJ3X3C1O+xSS7v7qO7+1/XnOOxSS7r7qOTfDbJq6b2Nyd54dT+\n4t289x8nub27n9ndP5fkkgca7HRFxjVJnrGbw0cneXWSTUlekeRnuvvYJO9J8jsPdG4AYDGEEQDA\nWld0903dfW+SLyQ5cg/97knykT0cuyvJRdP21XPn+Lck76+qVyXZsJvX/XKSd+/a6e7b9nHMtYf2\nK7v7m919Z5KvJvn01H5d9vy5AIAFE0YAAGvdObd9T5ID9tDvB3tZJ+J/+/8XprrvHN396iR/lOSI\nJFdX1WEPd7BVtSHJM5N8aTeH5z/LvXP792bPnwsAWDBhBACwr+5I8viHc4Kqelp3X97db07yrcxC\niXkXJ3nNXP9DH+B8j8psAcsbu/vahzM2AGAcYQQAsK/OSfLJXQtYPkR/MS0euT3J5zJb62He25Ic\numuRyyQn3O8MMx+qqmuTbM9sfYqTHsaYAIDBPNoTAAAAGMqVEQAAAMBQwggAAABgKGEEAAAAMJQw\nAgAAABhKGAEAAAAMJYwAAAAAhhJGAAAAAEMJIwAAAICh/g+Rcr3w0tpx2gAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f7834c11410>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "nn = len(Rs)-1\n",
    "fig, ax = subplots(figsize=(5,4) )\n",
    "  \n",
    "   \n",
    "plt.scatter(dim[1:], Rs[1:,1], edgecolor=\"k\", facecolor=\"w\" )\n",
    "ax.plot(dim[1:], Rs[0,1]*np.ones(nn)*0.9,'r-.', label=\"Testing: 0.9*baseline\")\n",
    "ax.plot(dim[1:], Rs[0,1]*np.ones(nn),'b-', label=\"Testing: baseline\")\n",
    "ax.set_xlabel('Intrinsic Dim')\n",
    "ax.set_ylabel('Accuracy')\n",
    "plt.grid()\n",
    "ax.legend()\n",
    "ax.set_ylim([-0.1,1.1])\n",
    "fig.set_size_inches(18, 10)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The above figure show that updating in the intrinsic space can prevent overfitting.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\nhZxGpZQ7SimzUsqDpZR3l1K+ebmutznRSim3llJ+uZTyzmVvv2q5/lmllLct+/GnSymfuFz/pOXr\n9yzfv/PAZ71iuf7rpZQvObDu+wtrUUrZKqX8x1LKA8vX+poTr5TyO8vvC+8opVxcrp367yPCiBUq\npWwl+adJ/nqSz0syKKV83nqrgmv68SQvumrtHyX5+Vrrs5P8/PJ1stfPz14+7k3yz5K9v1CTfGeS\nL0zyvCTfuf+X6nLP3zvwc1f/LliFjyX5llrr5yV5fpJvXP4drLc56f4kyQtrrc9J8twkLyqlPD/J\n9yb5wVrrZyf5gyTD5f5hkj9Yrv/gcl+W///wsiSfn73e/ZHlvwj6/sI6fXOSxYHX+ppN0a+1PvfA\nUZ2n/vuIMGK1npfkPbXW36q1/vck9yf5sjXXBH9GrfUXk3z4quUvS/La5fPXJvmbB9Z/ou55a5Kn\nllKemeRLkryl1vrhWusfJHlL9r4gPzPJk2utb617Q2p+4sBnwcrUWt9fa3378vlHs/fl9jOitznh\nlj16Zflye/moSV6Y5A3L9at7e7/n35Dkry7/q9mXJbm/1vontdbfTvKe7H138f2FtSilPCvJ/5zk\nR5evS/Q1m+vUfx8RRqzWZyR534HXv7tcg5Pg9lrr+5fP/3OS25fPH62vH2v9d6+xDs0sL9/9giRv\ni95mAyz/S+87knwge19IfzPJH9ZaP7bccrAfH+nh5fsfSfK03HzPw6r930n+YZKPL18/LfqazVCT\n/L+llEullHuXa6f++8gt6y4AOP5qrbWU4ugdTqRSypkkb0zy8lrrHx28jVJvc1LVWh9O8txSylOT\nvCnJX1pzSfCElFJekuQDtdZLpZRz664Hjliv1vp7pZRPS/KWUsqvHXzztH4fcWXEav1ekjsOvH7W\ncg1Ogv9vedlXln9+YLn+aH39WOvPusY6rFwpZTt7QcRP1Vp/Zrmst9kYtdY/TDJL8oLsXcq7/x+a\nDvbjIz28fP8pST6Um+95WKUvSvKlpZTfyd4tFC9M8kPR12yAWuvvLf/8QPYC5OfF9xFhxIr9SpJn\nL6cAf2L2hum8ec01wY16c5L9Kb1fk+RfH1j/6uWk3+cn+cjyErOfS/LXSimfshym89eS/NzyvT8q\npTx/eS/nVx/4LFiZZb9NkixqrT9w4C29zYlWSnnG8oqIlFI+OckXZ28myizJS5fbru7t/Z5/aZJf\nWN5X/OYkL1ueSvBZ2Rt69svx/YU1qLW+otb6rFrrndnruV+otf6d6GtOuFLKk0opt+0/z973iMvx\nfcRtGqtUa/1YKeUfZK9xtpL8WK313WsuC/6MUso0ybkkTy+l/G72JvV+T5LXl1KGSd6b5G8vt//b\nJC/O3kCo/5rkniSptX64lPJ/Zu9/7JPku2qt+0Mx/372Tuz45CQ/u3zAqn1Rkq9K8qvLe+uT5Nuj\ntzn5npnktcvTAT4hyetrrQ+UUh5Mcn8p5f9K8h+zF8Zl+edPllLek71hxS9Lklrru0spr0/yYPZO\nn/nG5e0f8f2FY+Tboq852W5P8qblbaK3JHldrfX/KaX8Sk7595GyFyACAAAAtOE2DQAAAKApYQQA\nAADQlDACAAAAaEoYAQAAADQljAAAAACaEkYAACmlXLmBPS8vpfwPj/H+j5ZSPu9x/O6zpZQfvon9\nF0opv15KeVcp5ddKKa8upTz1wPu/dLM1AABtOdoTAEgp5Uqt9cx19vxOkrO11g9e472tWuvDq6rv\nqt91Icm31lovllI+Mcl3L+v6n1r8fgDgiXNlBADwiFLKueWVB29YXnXwU2XPNyX59CSzUspsufdK\nKeX7SynvTPKC5c+dPfDeuJTyzlLKW0spty/Xv6KUcnm5/osHfucDy+dnSin3lVJ+dXnlw5c/Vr21\n1v+e5B8m+fOllOfs/+4Dn/vvSin/upTyW6WU7yml/J1Syi8vP/8vruQfIgBwXcIIAOBqX5Dk5Uk+\nL8lfSPJFtdYfTvL7Sfq11v5y35OSvK3W+pxa6/yqz3hSkrfWWp+T5BeT/L3l+iuTfMly/Uuv8bv/\njyQfqbX+j7XWv5zkF65X7PKKjHcm+UvXePs5Sb4+SSfJVyX5nFrr85L8aJKd6302AP9/e3esWkUQ\nhQH4H6KlRUgtBKzzEIK9TyEE8gpiZWdtY5XG0s5CtFYwIRBiwMoqgoWFhY1Rco/F3qtLzOrFy53q\n+6rZmdnDTPuznIX1EEYAAJcdVNXHqpolOU6yPbHvIsmzibXvSZ7Px0ejGq+T7LfW7iXZuOK9O0ke\nLx6q6suSZ24T84dV9amqzpN8SPJyPv8u0/cCANZMGAEAXHY+Gl8kuTax79tf+kT8qN+NqX7VqKrd\nJPeT3Exy1FrbWvWwrbWNJDtJ3l+xPL7LbPQ8y/S9AIA1E0YAAMv6muTGKgVaa7eq6m1VPUjyOUMo\nMfYqyd5o/+Y/6l3P0MDyrKpOVjkbANCPMAIAWNaTJC8WDSz/06N588jTJG8y9HoYe5hkc9HkMsnt\nPyoMnrbWTpKcZuhPcXeFMwEAnfm1JwAAANCVLyMAAACAroQRAAAAQFfCCAAAAKArYQQAAADQlTAC\nAAAA6EoYAQAAAHQljAAAAAC6EkYAAAAAXf0Etpzkd/KbtjUAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f7834b6ac10>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "nn = len(Rs)-1\n",
    "fig, ax = subplots(figsize=(5,4) )\n",
    "                  \n",
    "plt.scatter(dim[1:], Rs[1:,0], edgecolor=\"k\", facecolor=\"w\" )\n",
    "ax.plot(dim[1:], Rs[0,0]*np.ones(nn)/0.9,'r-.', label=\"Testing: baseline\")\n",
    "ax.set_xlabel('Intrinsic Dim')\n",
    "ax.set_ylabel('Loss')\n",
    "plt.grid()\n",
    "# ax.set_ylim([-0.1,1.1])\n",
    "fig.set_size_inches(18, 10)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 2",
   "language": "python",
   "name": "python2"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.12"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
